package cas ;

import java.io.IOException ;
import java.io.PrintWriter ;

import javax.servlet.http.Cookie ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
import javax.servlet.http.HttpSession ;

import org.json.JSONObject ;
import org.springframework.util.StringUtils ;

/**
 * cas client端的过滤器
 * @author 80002165 @date 2017年7月4日 上午10:58:54
 */
public class CasClientFilter {
    // 应用服务器中存入session的key
    private static final String SESSION_KEY = "current_user" ;
    private static final String TGC_KEY = "cas_tgc" ;
    
    /**
     * 验证本地是否有session，如果有则正常提供服务
     * @author 80002165 @date 2017年7月4日 上午11:01:39
     * @param request
     * @return
     */
    public boolean validateCurrSession(HttpServletRequest request) {
        HttpSession session = request.getSession() ;
        if (session != null) {
            String currentUser = (String) session.getAttribute(SESSION_KEY) ;
            if (StringUtils.hasText(currentUser))
                return true ;
        }
        return false ;
    }
    
    /**
     * 验证客户端发起的请求是否有TGC的cookie 如果有，则向casService验证期合法性，如果没有则返回false
     * TGC校验通过，则说明用户已经登录，返回true提供服务
     * TGC校验失败，则说明用户未登录，返回false，重定向到登录页面
     * @author 80002165 @date 2017年7月4日 上午11:04:33
     * @param request
     * @return
     */
    public boolean validateTGC(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies() ;
        String tgc = null ;
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                if (TGC_KEY.equals(cookie.getName())) {
                    tgc = cookie.getValue() ;
                    break ;
                }
            }
        }
        //客户端中包含TGC
        if(StringUtils.hasText(tgc)){
            String currUser = casServiceValidateTGC(tgc) ;
            if(StringUtils.hasText(currUser)){//casService校验TGC合法
                request.getSession().setAttribute(SESSION_KEY, currUser);
                return true ;
            }
        }
        return false ;
    }
    
    /**
     * 验证用户请求的ST（service ticket） 
     * 如果没有ST，则拒绝提供服务，重定向到cas登录获取ST
     * 如果ST验证通过，则返回true，提供服务。
     * @author 80002165 @date 2017年7月4日 上午11:02:21
     * @return
     */
    public boolean validateST(String st) {
        return false ;
    }
    
    /**
     * 使用httpclient发送请求道casService校验TGC。如果校验成功，则返回登录用户名用以缓存到本地session 
     * @author 80002165 @date 2017年7月4日 上午11:10:22
     * @param tgc
     * @return
     */
    public String casServiceValidateTGC(String tgc){
        return null ;
    }
    
    /**
     * 重定向到cas登录页面
     * @author 80002165 @date 2017年7月4日 上午11:13:59
     * @param casLoginUrl
     * @param request
     * @param response
     */
    public void redirectCasLogin(String casLoginUrl, HttpServletRequest request, HttpServletResponse response){
        
    }
    
    /**
     * 返回提示用户登录的json串
     * @author 80002165 @date 2017年7月4日 上午11:30:57
     * @param casLoginUrl
     * @param request
     * @param response
     * @throws Exception 
     */
    public void returnLoginMsg(String casLoginUrl, HttpServletRequest request, HttpServletResponse response) throws Exception{
//        String responseJSONObject;
//        PrintWriter out;
////        responseJSONObject = JSONObject.toJSONString(casLoginUrl);
//        response.setCharacterEncoding("UTF-8");
//        response.setContentType("application/json; charset=utf-8");
//        out = null;
//        out = response.getWriter();
//        out.append(responseJSONObject);
////        logger.debug("\u8FD4\u56DE\u662F\n");
////        logger.debug(responseJSONObject);
//        if(out != null)
//            out.close();
//        break MISSING_BLOCK_LABEL_104;
//        IOException e;
////        e;
////        logger.info("\u5199\u5165\u9519\u8BEF", e);
//        if(out != null)
//            out.close();
//        break MISSING_BLOCK_LABEL_104;
//        Exception exception;
////        exception;
//        if(out != null)
//            out.close();
//        throw exception;
    }
}
